package Servlets;

// --- Imports de base
//
import BDD.gestionnaires.GestionnairePhoto;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// --- Imports pour fichiers
//
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import javax.ejb.EJB;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpSession;
import javax.servlet.http.Part;

/**
 * Description : Servlet de traitement d'upload des images.
 * @author AZRIA Nouriel
 * @version 1.0.0
 */
@WebServlet(name = "ServletUploadImgs", urlPatterns = {"/ServletUploadImgs"})
@MultipartConfig(maxFileSize=1024*1024*10)  // Fichier jusqu'a 10MB
public class ServletUploadImgs extends HttpServlet {
    
    // Le lien avec le gestionnaire photo
    @EJB
    private GestionnairePhoto gestionnairePhoto;
    
    // --- Les chemins de sauvegarde des fichiers
    //
    //private static final String cheminInterne = "../../web/";
    private static final String cheminInterne = "";
    private static final String dossierSauvegarde = "PhotosUploads";
    private String nomUtilisateur = "";
    private String idAlbum = "";
    
    //--- Traitement de la requete receptionnee
    //
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        // Pratique pour décider de l'action à faire   
        String action = request.getParameter("action");  
        String forwardTo = "";  
        String message = "";  
        
        // --- Recuperer les informations necessaires a la construction de l'adresse de sauvegarde
        //
        
        // Recuperer le nom de l'utilisateur
        HttpSession session = request.getSession();
        //File.separator 
        if(session.getAttribute("loginUser") != null)
            nomUtilisateur = (String) "/" + session.getAttribute("loginUser"); 
        
        // Recuperer l'id de l'album
        int idAlbumInt = -1;
        if(request.getParameter("album") != null){
            idAlbum = (String) "/" + request.getParameter("album"); 
            idAlbumInt = Integer.parseInt(request.getParameter("album"));
        }

        // Traiter les cas recus
        if (action != null) {  
            
            // Traiter le cas d'un upload d'images
            if (action.equals("uploadImgs")) {  
                
                /*----------------- RECUPERATION ET SAUVEGARDE FICHIERS --------------------*/
                /*--------------------------------------------------------------------------*/

                // Recuperer chemin du dossier courant
                //String cheminDossCourant = request.getServletContext().getRealPath("");
                String cheminDossCourant = request.getServletContext().getRealPath(cheminInterne);

                // Recuperer chemin relatif du dossier de sauvegarde
                String cheminDossSauvegardeRelatif = "/" + dossierSauvegarde + nomUtilisateur + idAlbum;
                
                // Construire chemin du dossier de sauvegarde
                String cheminDossSauvgarde = cheminDossCourant + cheminDossSauvegardeRelatif;

                // Creer le dossier de sauvegarde si besoin (si non existant)
                File dossierSauvegarde = new File(cheminDossSauvgarde);
                if (!dossierSauvegarde.exists())
                    dossierSauvegarde.mkdirs();
                
                dossierSauvegarde.setWritable(true);
                dossierSauvegarde.setWritable(true);
                dossierSauvegarde.setExecutable(true);

                // Traiter chaque fichier uploade
                for (Part contenuReception : request.getParts()) {

                    // Recuperer le nom du fichier
                    String fileName = extractFileName(contenuReception);
                    
                    // Sauvegarder le fichier dans le disque
                    try{
                        
                        // Recuperer le fichier
                        InputStream unFichier = contenuReception.getInputStream();
                        
                        // Ouvrir le canal de destination (dans lequel le fichier va etre sauvegarde)
                        OutputStream destinationFichier = new FileOutputStream(new File(cheminDossSauvgarde + "/" + fileName));
                                
                        // Initialiser le conteneur temporaire des donnees
                        int pointageFichier = 0;
                        byte[] donnes = new byte[1024*10];

                        // Ecrire le fichier dans la destination
                        while ((pointageFichier = unFichier.read(donnes)) != -1)
                                destinationFichier.write(donnes, 0, pointageFichier);
                        
                        // Fermer les canaux d'ecriture
                        destinationFichier.close();
                        unFichier.close();
                        
                        /*----------------- AJOUT DANS LA BD PHOTO --------------------*/
                        /*-------------------------------------------------------------*/

                        // Ajouter la photo dans la base de donnes
                        gestionnairePhoto.ajouterPhotoBD(idAlbumInt, cheminDossSauvegardeRelatif + "/" + fileName, fileName);

                        // Indiquer que l'image a bien ete upload
                        response.setContentType("text/html;charset=UTF-8");
                        try (PrintWriter out = response.getWriter()) {
                            out.println("<span class='fichierAjoutCorrecte'>Le fichier '"+ fileName +"' a ete correctement ajoute</span><br/>");
                        }

                        /*-------------------------------------------------------------*/
                        /*-------------------------------------------------------------*/

                    }
                    catch(Exception e){
                        
                        // Indiquer que l'image n'a pas ete ajoute
                        response.setContentType("text/html;charset=UTF-8");
                        try (PrintWriter out = response.getWriter()) {
                            out.println("<span class='fichierAjoutNonCorrecte'>Le fichier '"+ fileName +"' n'a pas ete correctement ajoute</span><br/>");
                        }
                        
                    }
                }

                /*--------------------------------------------------------------------------*/
                /*--------------------------------------------------------------------------*/
                
            }
            
        }
        
        // Aller à la page suivante
        //RequestDispatcher dp = request.getRequestDispatcher(forwardTo + "&message=" + message);  
        //dp.forward(request, response); 
        
        
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
    
    /**
     * Extrait le nom du fichier de l'en-tete HTTP (content-disposition)
     * @return Une chaine contenant le nom du fichier
     * @param contenuReception Contenu de l'envoi des fichiers par formulaire
     */
    private String extractFileName(Part contenuReception) {
        String contentDisp = contenuReception.getHeader("content-disposition");
        String[] items = contentDisp.split(";");
        for (String s : items) {
            if (s.trim().startsWith("filename")) {
                return s.substring(s.indexOf("=") + 2, s.length()-1);
            }
        }
        return "";
    }

}
